﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SmallBasic.Library;

namespace ExText4SmallBasic
{
    public static partial class Text
    {
#if LANG_JA
        /// <summary>
        /// 与えられたテキストを、与えられた区切りのテキストで分割して、配列で取得します。
        /// </summary>
        /// <param name="text">分割するテキスト</param>
        /// <param name="separator">区切りのテキスト</param>
        /// <returns>
        /// <para>分割した後のテキストの配列</para>
        /// <para>a = Text.Split("My name is Mike."," ") -> a[1]="My", a[2]="name", a[3]="is", a[4]="Mike."</para>
        /// </returns>
#else
        /// <summary>
		/// Gets an array of text that are delimited by specified text.
        /// </summary>
        /// <param name="text">The text to split.</param>
        /// <param name="separator">Specifies delimiter.</param>
        /// <returns>
        /// <para>An array of text that are delimited by specified text.</para>
        /// <para>a = Text.Split("My name is Mike."," ") -> a[1]="My", a[2]="name", a[3]="is", a[4]="Mike."</para>
        /// </returns>
#endif
        public static Primitive Split(Primitive text, Primitive separator)
        {
            var result = new Primitive();
            var parts = ((string)text).Split(new[] { (string)separator }, StringSplitOptions.None);
            for (int i = 0; i < parts.Length; i++)
            {
                result[i + 1] = parts[i];
            }
            return result;
        }

#if LANG_JA
        /// <summary>
        /// 与えられたテキストのうち、指定したテキスト部分を、別のテキストに置き換えます。
        /// </summary>
        /// <param name="text">置換される対象のテキストです。</param>
        /// <param name="oldtext">置き換えるもとの部分のテキストです。</param>
        /// <param name="newtext">置き換えるテキストです。</param>
        /// <returns>置き換えた後のテキストです。</returns>
#else
        /// <summary>
        /// Replaces the matched sub-text with a new sub-text.
        /// </summary>
        /// <param name="text"></param>
        /// <param name="oldtext">The text to be replaced.</param>
        /// <param name="newtext">The text to replace all occurrences of oldtext.</param>
        /// <returns>
        /// <para>The text that is all oldtext are replaced with newtext.</para>
        /// <para>a = Text.Replace("My name is Mike.","Mike","Tom") -> a="My name is Tom."</para>
        /// </returns>
#endif
        public static Primitive Replace(Primitive text, Primitive oldtext, Primitive newtext)
        {
            return ((string)text).Replace(oldtext, newtext);
        }

#if LANG_JA
        /// <summary>
        /// 与えられたテキストの左側から、指定した長さのサブテキストを取得します。
        /// </summary>
        /// <param name="text">サブテキストを取り出すもとのテキストです。</param>
        /// <param name="length">サブテキストの長さを指定します。</param>
        /// <returns>
        /// <para>要求されたサブテキスト</para>
        /// <para>a = Text.Left("My name is Mike.",4) -> a="My n"</para>
        /// </returns>
#else
        /// <summary>
        /// Gets a sub-text containing a specified number of characters from the left side of the given text.
        /// </summary>
        /// <param name="text">The text to derive the sub-text from.</param>
        /// <param name="length">Specifies the length of the sub text.</param>
        /// <returns>
        /// <para>The requested sub-text.</para>
        /// <para>a = Text.Left("My name is Mike.",4) -> a="My n"</para>
        /// </returns>
#endif
        public static Primitive Left(Primitive text, Primitive length)
        {
            return Microsoft.SmallBasic.Library.Text.GetSubText(text, 1, length);
        }

#if LANG_JA
        /// <summary>
        /// 与えられたテキストの右側から、指定した長さのサブテキストを取得します。
        /// </summary>
        /// <param name="text">サブテキストを取り出すもとのテキストです。</param>
        /// <param name="length">サブテキストの長さを指定します。</param>
        /// <returns>
        /// <para>要求されたサブテキスト</para>
        /// <para>a = Text.Right("My name is Mike.",4) -> a="ike."</para>
        /// </returns>
#else
        /// <summary>
        /// Gets a sub-text containing a specified number of characters from the right side of the given text.
        /// </summary>
        /// <param name="text">The text to derive the sub-text from.</param>
        /// <param name="length">Specifies the length of the sub text.</param>
        /// <returns>
        /// <para>The requested sub-text.</para>
        /// <para>a = Text.Right("My name is Mike.",4) -> a="ike."</para>
        /// </returns>
#endif
        public static Primitive Right(Primitive text, Primitive length)
        {
            var str = (string)text;
            return str.Substring(System.Math.Max(0, str.Length - length), System.Math.Min(str.Length, length));
        }

#if LANG_JA
        /// <summary>
        /// <para>与えられたテキストからサブテキストを取得します。</para>
        /// <para>(このメソッドは GetSubText メソッドに同じです)</para>
        /// </summary>
        /// <param name="text">サブテキストを取り出すもとのテキストです。</param>
        /// <param name="start">どこから開始するかを指定します。</param>
        /// <param name="length">サブテキストの長さを指定します。</param>
        /// <returns>
        /// <para>要求されたサブテキスト</para>
        /// <para>a = Text.Mid("My name is Mike.",9,2) -> a="is"</para>
        /// </returns>
#else
        /// <summary>
        /// <para>Gets a sub-text from the given text.</para>
        /// <para>(This method is the alias of GetSubText method.)</para>
        /// </summary>
        /// <param name="text">The text to derive the sub-text from.</param>
        /// <param name="start">Specifies where to start from.</param>
        /// <param name="length">Specifies the length of the sub text.</param>
        /// <returns>
        /// <para>The requested sub-text</para>
        /// <para>a = Text.Mid("My name is Mike.",9,2) -> a="is"</para>
        /// </returns>
#endif
        public static Primitive Mid(Primitive text, Primitive start, Primitive length)
        {
            return Microsoft.SmallBasic.Library.Text.GetSubText(text, start, length);
        }

#if LANG_JA
        /// <summary>
        /// <para>与えられたテキストの長さを取得します。</para>
        /// <para>(このメソッドは GetLength メソッドに同じです)</para>
        /// </summary>
        /// <param name="text">長さを求めるテキストです。</param>
        /// <returns>与えられたテキストの長さです。</returns>
#else
        /// <summary>
        /// <para>Gets the length of the given text.</para>
        /// <para>(This method is the alias of GetLength method.)</para>
        /// </summary>
        /// <param name="text">The text whose length is needed.</param>
        /// <returns>The length of the given text.</returns>
#endif
        public static Primitive Len(Primitive text)
        {
            return Microsoft.SmallBasic.Library.Text.GetLength(text);
        }
    }
}
